<?

// Classe que parsa XML i retorna arbres equivalents

class xmlparser
{
	 var $parser;            // parsador XML de PHP
	 var $err;               // codi d'error
	 var $errdesc;           // descripcio de l'error
	 var $arb;               // arbre a retornar
	 var $lastnode;          // ultim node
	 
	 function xmlparser()
	 {
		  // Constructora
		  $this->parser=xml_parser_create();
        xml_set_object($this->parser, &$this);
		  xml_set_element_handler($this->parser, "otag", "ctag");
		  xml_set_character_data_handler($this->parser, "cdata");
		  
		  $this->err=0;
		  $this->errdesc="";
		  $this->arb=NULL;
		  $this->lastnode=NULL;
	 }
	 
	 
    function parse($data)
	 {
		  // Parsa l'XML i retorna l'arbre
//		  echo("<BR>parse ---- <BR><BR>");
		  
//		  echo("<TABLE width=100% border=1>");
//		  echo("<TR><TD align=center>op</TD><TD align=center>parser</TD><TD align=center>tag</TD><TD align=center>attr</TD><TD align=center>cdata</TD></TR>");
		  
		  if (!xml_parse($this->parser, $data))
		  {
				$this->err=xml_get_error_code($this->parser);
				$this->errdesc=xml_error_string($this->err);
				echo("<H2>Fatal error</h2>");
				echo("ERROR: ".$this->err." ".$this->errdesc."<BR>".htmlspecialchars($data));
				
				return FALSE;
		  }
		  
//		  echo("</TABLE>");
		  
		  return ($this->arb);
	 }
	 
    function otag($parser, $tag, $attributes)
	 {
//		  echo("<BR>tag_open ----");

		  // Convertim els atributs al nostre format
		  $tmp=new xmlparams();
		  $tmp->addParamsFromArray($attributes);		  
		  
/*		  echo("<TR><TD>OPEN</TD><TD align=center>&nbsp;");
		  var_dump($parser);
		  echo("</TD><TD align=center>&nbsp;");
		  var_dump($tag);
		  echo("</TD><TD align=center>&nbsp;");
		  var_dump($attributes);*/
//		  echo("<BR><BR>Atributs propis: "); var_dump($tmp->pararr);
//		  echo("</TD><TD align=center>N/A</TD></TR>");
		  
		  
		  if ($this->lastnode!=NULL) // no es el primer node
		  {
				$this->lastnode=&$this->lastnode->nouFill($tag, "tag", "<".$tag.">", $tmp->pararr);
				$this->lastnode->endtag="</".$tag.">";
		  }
		  else
		  {
				$this->arb=new arbre($tag, "root", "xmldata", $tmp->pararr);
				$this->lastnode=&$this->arb;				
		  }
	 }
	 
	 
	 function ctag($parser, $tag)
	 {
//		  echo("<BR>tag_close ----");
/*		  echo("<TR><TD>CLOSE</TD><TD align=center>&nbsp;");
		  var_dump($parser);
		  echo("</TD><TD align=center>&nbsp;");
		  var_dump($tag);
		  echo("</TD><TD align=center>N/A</TD><TD align=center>N/A</TD></TR>");*/

		  $this->lastnode=&$this->lastnode->pare;
	 }
	 
	 	 
	 function cdata($parser, $cdata)
	 {
//		  echo("<BR>cdata ----");
		  // EL MOLT CABRIT PASSA ELS html entities (&lt; i companyia)
		  // AL QUE VALEN DE VERITAT :(((
		  $cdata=htmlspecialchars($cdata);
		  
/*		  echo("<TR><TD>CDATA</TD><TD align=center>");
		  var_dump($parser);
		  echo("</TD><TD align=center>N/A</TD><TD align=center>N/A</TD><TD align=center>");
		  var_dump($cdata);
		  echo("--- cdata = $cdata -- strlen = ".strlen($cdata));
		  echo("</TD></TR>");		  
*/		  
		  $this->lastnode->nouFill("xmlcdata", "cdata", $cdata, $attributes);

	 }
	 
	 
}

?>
